package controller

import (
	"ruanGongKeShe16Zu/response"
	"ruanGongKeShe16Zu/service"
	"ruanGongKeShe16Zu/service/vo"
	"strconv"

	"github.com/gin-gonic/gin"
)

type ICartController interface {
	GeneralController
	ListCart(ctx *gin.Context)
	SelectByUserID(ctx *gin.Context)
	DeleteByUserID(ctx *gin.Context)
}

type CartController struct {
	Service service.CartService
}

func NewCartController() ICartController {
	service := service.GetCartService()
	return CartController{
		Service: *service,
	}
}

func (c CartController) Create(ctx *gin.Context) {
	var req vo.CartReq
	if err := ctx.ShouldBind(&req); err != nil {
		response.Fail(ctx, gin.H{"error": err.Error()}, "数据验证错误")
		return
	}
	resp, err := c.Service.Create(ctx, &req)
	if err != nil {
		// utils.LogrusObj.Infoln(err)
		response.Fail(ctx, nil, "创建失败")
		return
	}
	response.Success(ctx, gin.H{"cart": resp}, "创建成功")
}

func (c CartController) Retrieve(ctx *gin.Context) {
	//获取path中的参数
	cartId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	cart, err := c.Service.Retrieve(ctx, cartId)
	if err != nil {
		response.Fail(ctx, nil, "条目不存在")
		return
	}
	response.Success(ctx, gin.H{"cart": cart}, "查询成功")
}
func (c CartController) Update(ctx *gin.Context) {
	//绑定body中的参数
	var requestCart vo.CartReq
	if err := ctx.ShouldBind(&requestCart); err != nil {
		response.Fail(ctx, nil, "数据验证错误")
		return
	}
	//获取path中的参数
	cartId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	updateCart, err := c.Service.Retrieve(ctx, cartId)
	if err != nil {
		response.Fail(ctx, nil, "条目不存在")
		return
	}

	//更新分类
	//可传map,struct,name value
	cart, err := c.Service.Update(ctx, updateCart, &requestCart)
	if err != nil {
		response.Fail(ctx, nil, "更新失败")
		return
	}
	response.Success(ctx, gin.H{"cart": cart}, "更新成功")
}

func (c CartController) Delete(ctx *gin.Context) {
	//获取path中的参数
	cartId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	_, err := c.Service.Retrieve(ctx, cartId)
	if err != nil {
		response.Fail(ctx, nil, "条目不存在")
		return
	}

	err = c.Service.Delete(ctx, cartId)
	if err != nil {
		response.Fail(ctx, nil, "删除失败，请重试")
		return
	}

	response.Success(ctx, nil, "删除成功")
}

func (c CartController) ListCart(ctx *gin.Context) {
	var req vo.ListCartReq
	if err := ctx.ShouldBind(&req); err != nil {
		// 参数校验
		// utils.LogrusObj.Infoln(err)
		response.Fail(ctx, nil, "参数不能为空!")
		return
	}

	resp, err := c.Service.CartList(ctx, &req)
	if err != nil {
		// utils.LogrusObj.Infoln(err)
		response.Fail(ctx, nil, "查询失败")
		return
	}
	response.Success(ctx, gin.H{"Carts": resp}, "查询成功")
}

func (c CartController) SelectByUserID(ctx *gin.Context) {
	//获取path中的参数
	userID, _ := strconv.Atoi(ctx.Params.ByName("id"))
	var req vo.ListCartReq
	if err := ctx.ShouldBind(&req); err != nil {
		// 参数校验
		// utils.LogrusObj.Infoln(err)
		response.Fail(ctx, nil, "参数不能为空!")
		return
	}

	resp, err := c.Service.SelectByUserID(ctx, &req, uint(userID))
	if err != nil {
		// utils.LogrusObj.Infoln(err)
		response.Fail(ctx, nil, "查询失败")
		return
	}
	response.Success(ctx, gin.H{"Carts": resp}, "查询成功")
}

func (c CartController) DeleteByUserID(ctx *gin.Context) {
	//获取path中的参数
	userID, _ := strconv.Atoi(ctx.Params.ByName("id"))
	err := c.Service.DeleteByUserID(ctx, uint(userID))
	if err != nil {
		// utils.LogrusObj.Infoln(err)
		response.Fail(ctx, nil, "删除失败")
		return
	}
	response.Success(ctx, nil, "删除成功")
}
